home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-05-06 | 3.0 KB | 147 lines | [TEXT/MPS ] |
- /*
- search routine generated by gen.
- skip=lc, match=fwd, shift=inc
- */
- #include "freq.h"
- #include "sd.h"
- /*
- * The authors of this software are Andrew Hume and Daniel Sunday.
- *
- * Copyright (c) 1991 by AT&T and Daniel Sunday.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- *
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR AT&T MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
- #ifndef CHARTYPE
- #define CHARTYPE unsigned char
- #endif
- #define MAXPAT 256
-
- #include "stats.h"
-
- #ifndef TABTYPE
- #define TABTYPE long
- #endif
- typedef TABTYPE Tab;
-
- static struct
- {
- int patlen;
- CHARTYPE pat[MAXPAT];
- Tab delta[256];
- int loopoffset; /* patlen-1 - skip loop char */
- } pat;
-
- prep(base, m)
- CHARTYPE *base;
- register m;
- {
- CHARTYPE *skipc;
- register CHARTYPE *pe, *pb;
- register int j, r;
- register Tab *d;
- double tmax, fr;
- extern double tcmp;
- extern option;
-
- pat.patlen = m;
- if(m > MAXPAT)
- abort();
- memcpy(pat.pat, base, m);
- skipc = 0;
- stats.len = m;
- if(sd[m] == 0){
- for(j = m; sd[j] == 0; j--)
- sd[j] = 12;
- }
- d = pat.delta;
- tmax = 2+tcmp;
- for(pb = pat.pat, pe = pb+pat.patlen-1; pb <= pe; pb++){
- fr = (1+tcmp*freq[*pb])/sd[pb-pat.pat];
- #ifdef STATS
- /*printf("i=%d: f=%.4f freq[%c]=%.5f sd=%.1f\n", (pb-pat.pat), fr, *pb, freq[*pb], sd[pb-pat.pat]);/**/
- #endif
- if(tmax > fr){
- tmax = fr;
- r = pb-pat.pat;
- }
- }
- pat.loopoffset = m-1-r;
- if(option >= 0) pat.loopoffset=option;
- skipc = &pat.pat[m-1-pat.loopoffset];
- for(j = 0; j < 256; j++)
- d[j] = m-pat.loopoffset;
- for(pb = pat.pat, pe = pb+m-1-pat.loopoffset; pb <= pe; pb++){
- d[*pb] = pe-pb;
- }
- }
-
- exec(base, n)
- CHARTYPE *base;
- {
- int nmatch = 0;
- register CHARTYPE *e, *s;
- register Tab *d0 = pat.delta;
- register k, s_offset;
- register CHARTYPE *p, *q;
- register CHARTYPE *ep;
-
- k = pat.patlen-1-pat.loopoffset; /* k is char we loop on */
- s = base+k;
- e = base+n;
- memset(e, pat.pat[k], pat.patlen);
- s_offset = -k;
- ep = pat.pat + pat.patlen;
- while(s < e){
- #ifdef STATS
- k = d0[*s];
- stats.jump++;
- while(k){
- stats.jump++; stats.step[k]++;
- k = d0[*(s += k)];
- stats.jump++; stats.step[k]++;
- k = d0[*(s += k)];
- stats.jump++; stats.step[k]++;
- k = d0[*(s += k)];
- }
- if(s >= e)
- return(nmatch);
- #else
- k = d0[*s];
- while(k){
- k = d0[*(s += k)];
- k = d0[*(s += k)];
- k = d0[*(s += k)];
- }
- if(s >= e)
- return(nmatch);
- #endif
- #ifdef STATS
- stats.slow++;
- #endif
- for(p = pat.pat, q = s+s_offset; p < ep; ){
- #ifdef STATS
- stats.cmp++;
- #endif
- if(*q++ != *p++)
- goto mismatch;
- }
- nmatch++;
- mismatch:
- s++;
- #ifdef STATS
- stats.step[1]++;
- #endif
- }
- return(nmatch);
- }
-